package lockDemo;

/**
 * @author Ajie
 * @date 2022/7/21
 * @function
 * Volatile 单个读/写具有原子性
 * 单个 volatile 变量的读/写（比如 vl=l）具有原子性，复合操作（比如 i++）不具有原子性，
 *
 * 怎么测试，还是反编译看字节码
 *
 */
public class VolatileFeaturesA {

    public static void main(String[] args) {
        VolatileFeaturesA volatileFeaturesA = new VolatileFeaturesA();
        Thread threada = new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 10000; i++) {

                }
            }
        });
    }

    private volatile long vol = 0L;

    /**
     * 单个读具有原子性
     * @date:2020 年 7 月 14 日 下午 5:02:38
     */
    public long get() {
        return vol;
    }

    /**
     * 单个写具有原子性
     * @date:2020 年 7 月 14 日 下午 5:01:49
     */
    public void set(long l) {
        vol = l;
    }

    /**
     * 复合（多个）读和写不具有原子性
     * @date:2020 年 7 月 14 日 下午 5:02:24
     */
    public void getAndAdd() {
        vol++;
    }

}
